64-bit hvm on 32-bit dom0 - ioemu adjustments
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Tue, 15 May 2007 08:59:51 +0000 (09:59 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Tue, 15 May 2007 08:59:51 +0000 (09:59 +0100)
Don't mask off data bits when running 64-bit hvm guests on 32-bit dom0.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
tools/ioemu/target-i386-dm/helper2.c

index 268bf25f0f101c0647b1b1e239a2a12bab155cd0..4d43b1802c9b5a90c2369bac24d457cd76f2ae2a 100644 (file)
@@ -322,7 +322,7 @@ void cpu_ioreq_pio(CPUState *env, ioreq_t *req)
             do_outp(env, req->addr, req->size, req->data);
         } else {
             for (i = 0; i < req->count; i++) {
-                unsigned long tmp;
+                unsigned long tmp = 0;
 
                 read_physical((target_phys_addr_t) req->data
                   + (sign * i * req->size),
@@ -354,7 +354,7 @@ void cpu_ioreq_move(CPUState *env, ioreq_t *req)
             }
         }
     } else {
-        unsigned long tmp;
+        target_ulong tmp;
 
         if (req->dir == IOREQ_READ) {
             for (i = 0; i < req->count; i++) {
@@ -380,14 +380,14 @@ void cpu_ioreq_move(CPUState *env, ioreq_t *req)
 
 void cpu_ioreq_and(CPUState *env, ioreq_t *req)
 {
-    unsigned long tmp1, tmp2;
+    target_ulong tmp1, tmp2;
 
     if (req->data_is_ptr != 0)
         hw_error("expected scalar value");
 
     read_physical(req->addr, req->size, &tmp1);
     if (req->dir == IOREQ_WRITE) {
-        tmp2 = tmp1 & (unsigned long) req->data;
+        tmp2 = tmp1 & (target_ulong) req->data;
         write_physical(req->addr, req->size, &tmp2);
     }
     req->data = tmp1;
@@ -395,14 +395,14 @@ void cpu_ioreq_and(CPUState *env, ioreq_t *req)
 
 void cpu_ioreq_add(CPUState *env, ioreq_t *req)
 {
-    unsigned long tmp1, tmp2;
+    target_ulong tmp1, tmp2;
 
     if (req->data_is_ptr != 0)
         hw_error("expected scalar value");
 
     read_physical(req->addr, req->size, &tmp1);
     if (req->dir == IOREQ_WRITE) {
-        tmp2 = tmp1 + (unsigned long) req->data;
+        tmp2 = tmp1 + (target_ulong) req->data;
         write_physical(req->addr, req->size, &tmp2);
     }
     req->data = tmp1;
@@ -410,14 +410,14 @@ void cpu_ioreq_add(CPUState *env, ioreq_t *req)
 
 void cpu_ioreq_sub(CPUState *env, ioreq_t *req)
 {
-    unsigned long tmp1, tmp2;
+    target_ulong tmp1, tmp2;
 
     if (req->data_is_ptr != 0)
         hw_error("expected scalar value");
 
     read_physical(req->addr, req->size, &tmp1);
     if (req->dir == IOREQ_WRITE) {
-        tmp2 = tmp1 - (unsigned long) req->data;
+        tmp2 = tmp1 - (target_ulong) req->data;
         write_physical(req->addr, req->size, &tmp2);
     }
     req->data = tmp1;
@@ -425,14 +425,14 @@ void cpu_ioreq_sub(CPUState *env, ioreq_t *req)
 
 void cpu_ioreq_or(CPUState *env, ioreq_t *req)
 {
-    unsigned long tmp1, tmp2;
+    target_ulong tmp1, tmp2;
 
     if (req->data_is_ptr != 0)
         hw_error("expected scalar value");
 
     read_physical(req->addr, req->size, &tmp1);
     if (req->dir == IOREQ_WRITE) {
-        tmp2 = tmp1 | (unsigned long) req->data;
+        tmp2 = tmp1 | (target_ulong) req->data;
         write_physical(req->addr, req->size, &tmp2);
     }
     req->data = tmp1;
@@ -440,14 +440,14 @@ void cpu_ioreq_or(CPUState *env, ioreq_t *req)
 
 void cpu_ioreq_xor(CPUState *env, ioreq_t *req)
 {
-    unsigned long tmp1, tmp2;
+    target_ulong tmp1, tmp2;
 
     if (req->data_is_ptr != 0)
         hw_error("expected scalar value");
 
     read_physical(req->addr, req->size, &tmp1);
     if (req->dir == IOREQ_WRITE) {
-        tmp2 = tmp1 ^ (unsigned long) req->data;
+        tmp2 = tmp1 ^ (target_ulong) req->data;
         write_physical(req->addr, req->size, &tmp2);
     }
     req->data = tmp1;
@@ -495,12 +495,9 @@ void cpu_ioreq_xchg(CPUState *env, ioreq_t *req)
 
 void __handle_ioreq(CPUState *env, ioreq_t *req)
 {
-    if (!req->data_is_ptr && (req->dir == IOREQ_WRITE)) {
-        /* Clamp data operand to size of a long. */
-        if (req->size < sizeof(long))
-            req->data &= (1UL << (8 * req->size)) - 1;
-        req->data = (unsigned long)req->data;
-    }
+    if (!req->data_is_ptr && (req->dir == IOREQ_WRITE) &&
+        (req->size < sizeof(target_ulong)))
+        req->data &= ((target_ulong)1 << (8 * req->size)) - 1;
 
     switch (req->type) {
     case IOREQ_TYPE_PIO: